]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
inhibitShortcuts: Save choice in permission store
authorOlivier Fourdan <ofourdan@redhat.com>
Fri, 1 Feb 2019 16:44:05 +0000 (17:44 +0100)
committerOlivier Fourdan <ofourdan@redhat.com>
Mon, 4 Mar 2019 09:12:58 +0000 (10:12 +0100)
Use the permission store to remember the user's decision as to whether
or not grant the shortcuts request when the application is known.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/382

js/ui/inhibitShortcutsDialog.js

index 46e760a9838e69d0958537a11f0cf20664f41e1a..170cd1a33938d0f2453fc8fd8dce431f88b780e7 100644 (file)
@@ -1,11 +1,16 @@
-const { Clutter, Gio, GObject, Gtk, Meta, Shell } = imports.gi;
+const { Clutter, Gio, GLib, GObject, Gtk, Meta, Shell } = imports.gi;
 
 const Dialog = imports.ui.dialog;
 const ModalDialog = imports.ui.modalDialog;
+const PermissionStore = imports.misc.permissionStore;
 
 const WAYLAND_KEYBINDINGS_SCHEMA = 'org.gnome.mutter.wayland.keybindings';
 
 const APP_WHITELIST = ['gnome-control-center.desktop'];
+const APP_PERMISSIONS_TABLE = 'gnome';
+const APP_PERMISSIONS_ID = 'shortcuts-inhibitor';
+const GRANTED = 'GRANTED';
+const DENIED = 'DENIED';
 
 var DialogResponse = Meta.InhibitShortcutsDialogResponse;
 
@@ -43,6 +48,29 @@ var InhibitShortcutsDialog = GObject.registerClass({
                                                Gtk.accelerator_parse(accel));
     }
 
+    _shouldUsePermStore() {
+        return this._app && !this._app.is_window_backed();
+    }
+
+    _saveToPermissionStore(grant) {
+        if (!this._shouldUsePermStore() || this._permStore == null)
+            return;
+
+        let permissions = {};
+        permissions[this._app.get_id()] = [grant];
+        let data = GLib.Variant.new('av', {});
+
+        this._permStore.SetRemote(APP_PERMISSIONS_TABLE,
+                                  true,
+                                  APP_PERMISSIONS_ID,
+                                  permissions,
+                                  data,
+            (result, error) => {
+                if (error != null)
+                    log(error.message);
+            });
+    }
+
     _buildLayout() {
         let name = this._app ? this._app.get_name() : this._window.title;
 
@@ -64,12 +92,14 @@ var InhibitShortcutsDialog = GObject.registerClass({
 
         this._dialog.addButton({ label: _("Deny"),
                                  action: () => {
+                                     this._saveToPermissionStore(DENIED);
                                      this._emitResponse(DialogResponse.DENY);
                                  },
                                  key: Clutter.KEY_Escape });
 
         this._dialog.addButton({ label: _("Allow"),
                                  action: () => {
+                                     this._saveToPermissionStore(GRANTED);
                                      this._emitResponse(DialogResponse.ALLOW);
                                  },
                                  default: true });
@@ -81,10 +111,43 @@ var InhibitShortcutsDialog = GObject.registerClass({
     }
 
     vfunc_show() {
-        if (this._app && APP_WHITELIST.indexOf(this._app.get_id()) != -1)
+        if (this._app && APP_WHITELIST.indexOf(this._app.get_id()) != -1) {
             this._emitResponse(DialogResponse.ALLOW);
-        else
+            return;
+        }
+
+        if (!this._shouldUsePermStore()) {
             this._dialog.open();
+            return;
+        }
+
+        /* Check with the permission store */
+        let appId = this._app.get_id();
+        this._permStore = new PermissionStore.PermissionStore((proxy, error) => {
+            if (error) {
+                log(error.message);
+                this._dialog.open();
+                return;
+            }
+
+            this._permStore.LookupRemote(APP_PERMISSIONS_TABLE,
+                                         APP_PERMISSIONS_ID,
+                (res, error) => {
+                    if (error) {
+                        this._dialog.open();
+                        log(error.message);
+                        return;
+                    }
+
+                    let [permissions, data] = res;
+                    if (permissions[appId] === undefined) // Not found
+                        this._dialog.open();
+                    else if (permissions[appId] == GRANTED)
+                        this._emitResponse(DialogResponse.ALLOW);
+                    else
+                        this._emitResponse(DialogResponse.DENY);
+                });
+        });
     }
 
     vfunc_hide() {